package com.fqdf.framework.android.service.downloadservice;

/**
 * @author 张枭
 * date 2017/3/9
 * @version V1.0
 * @throws ${tags}
 */

import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;


import com.fqdf.framework.android.service.downloadservice.helper.DownloadHelper;
import com.fqdf.framework.android.service.downloadservice.helper.OkHttpDownloadHelper;
import com.fqdf.framework.android.util.CheckLogicUtil;
import com.fqdf.framework.android.util.FileUtil;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * 下载文件service,只适合下载比较小的文件，如果大文件，请使用downloadmanager
 */
public class DownloadIntentService extends IntentService {


    private DownloadHelper downloadHelper;

    /**
     * 开始下载的工具方法
     *
     * @param context 上下文
     * @param item    下载bean对象
     */
    public static void startDownload(Context context, DownloadBean item) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(DownloadConstans.DOWNLOAD_ONE, item);
        startItentService(context, bundle);
    }

    /**
     * 开始下载的工具方法
     *
     * @param context  上下文
     * @param dataList 下载bean list对象
     */
    public static void startDownload(Context context, List<DownloadBean> dataList) {
        ArrayList<DownloadBean> arrayList;
        if (dataList instanceof ArrayList) {
            arrayList = (ArrayList<DownloadBean>) dataList;
        } else {
            arrayList = new ArrayList<>(dataList);
        }
        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList(DownloadConstans.DOWNLOAD_LIST, arrayList);
        startItentService(context, bundle);
    }

    /**
     * 开始下载的工具方法
     *
     * @param context 上下文
     * @param url     下载的url
     * @param path    下载要保存的文件path
     */
    public static void startDownload(Context context, String url, String path) {
        DownloadBean bean = new DownloadBean.Builder().withUrl(url).withSavePath(path).build();
        startDownload(context, bean);
    }

    /**
     * 开始下载的工具方法
     *
     * @param context 上下文
     * @param url     下载的url
     * @param file    下载要保存的文件
     */
    public static void startDownload(Context context, String url, File file) {
        DownloadBean bean = new DownloadBean.Builder().withUrl(url).withSavePath(file.getPath()).build();
        startDownload(context, bean);
    }

    /**
     * 打开intentservice
     *
     * @param context 上下文内容
     * @param bundle  需要传递的bundle
     */
    private static void startItentService(Context context, Bundle bundle) {
        Intent intent = new Intent(context, DownloadIntentService.class);
        intent.putExtras(bundle);
        context.startService(intent);
    }

    public DownloadIntentService() {
        super("DownloadIntentService");
    }

    /**
     * 获取下载helper实例
     *
     * @return
     */
    protected DownloadHelper getDownloadHelper() {
        if (downloadHelper == null) {
            downloadHelper = new OkHttpDownloadHelper();
        }
        return downloadHelper;
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Bundle bundle = intent.getExtras();
        // 先进行判断，判断是否传入了要进行下载的key，以及判断是下载一个文件还是一组文件
        if (bundle != null && (bundle.containsKey(DownloadConstans.DOWNLOAD_ONE)
                || bundle.containsKey(DownloadConstans.DOWNLOAD_LIST))) {
            // 定义intent用来做下载完成后发送广播
            Intent receiverIntent = new Intent(DownloadConstans.DOWNLOAD_COMPLETE_ACTION);
            Bundle dataBundle = new Bundle();
            // 如果是下载一个文件走下载一个文件的逻辑
            if (bundle.containsKey(DownloadConstans.DOWNLOAD_ONE)) {
                DownloadBean downloadBean = bundle.getParcelable(DownloadConstans.DOWNLOAD_ONE);
                dataBundle.putParcelable(DownloadConstans.DOWNLOAD_ONE, download(downloadBean));
            }
            // 如果是下载多个文件走下载多个文件的逻辑
            if (bundle.containsKey(DownloadConstans.DOWNLOAD_LIST)) {
                ArrayList<DownloadBean> downloadBeans = bundle.getParcelableArrayList(DownloadConstans.DOWNLOAD_LIST);
                dataBundle.putParcelableArrayList(DownloadConstans.DOWNLOAD_LIST, download(downloadBeans));
            }
            // 发送广播
            receiverIntent.putExtras(dataBundle);
            sendBroadcast(receiverIntent);
        }
    }


    /**
     * 进行下载的逻辑
     *
     * @param item 下载对象bean
     * @return 下载完成后返回的对象，这个对象和传入的对象为同一个对象，没做额外处理
     */
    private DownloadBean download(final DownloadBean item) {
        // 判断是否传入的bean中的参数合法
        if (item != null && !CheckLogicUtil.isEmpty(item.getUrl()) && !CheckLogicUtil.isEmpty(item.getSavePath())) {
            // 保存的文件是否存在
            if (FileUtil.isExists(item.getSavePath())) {
                // 存在的文件是否进行跳过
                if (item.isSkip()) {
                    item.setResult(DownloadConstans.RESULT.SUCCESS);
                    return item;
                }
                // 是否进行删除文件
                if (!FileUtil.deleteFile(item.getSavePath())) {
                    item.setResult(DownloadConstans.RESULT.EXCEPTION);
                    return item;
                }
            }
            // 进行文件下载
            item.setResult(getDownloadHelper().downloadFile(item.getUrl(), item.getSavePath()));
            return item;
        } else {
            if (item == null) {
                return null;
            }
            // 传入参数错误
            item.setResult(DownloadConstans.RESULT.PARAMS);
            return item;
        }
    }

    /**
     * 进行下载一组文件的逻辑
     * 这个逻辑中newDatalist按照现在的逻辑看是没有用的，
     * 实际上与list都是相同的引用，但是为了防止之后扩展内部处理导致引用变化所以采用了这个对象，主要为了方式逻辑混乱
     *
     * @param list 一组文件的downloadbean对象
     * @return 下载后的list对象
     */
    private ArrayList<DownloadBean> download(final ArrayList<DownloadBean> list) {
        ArrayList<DownloadBean> newDataList = new ArrayList<>();
        if (!CheckLogicUtil.isEmpty(list)) {
            for (DownloadBean item : list) {
                newDataList.add(download(item));
            }
        }
        return newDataList;
    }

}